﻿using System;

namespace SoftwareConsulting.BI11.NumericalMethods.DifferentialEquations
{    
    /// <summary>
    /// Класс скорректированного метода Эйлера для решения диф.уравнений
    /// </summary>
    public class EulerCorrected
    {
        private double[,] _result;

        /// <summary>
        /// Конструктор по умолчанию
        /// </summary>
        /// <param name="function">Функция, требующая решения</param>
        /// <param name="beginPointValue">Значение начальной точки интервала</param>
        /// <param name="endPointValue">Значение конечной точки интервала</param>
        /// <param name="y0">Начальное условие</param>
        /// <param name="pointsNumber">число точек</param>
        public EulerCorrected(FunctionWithTwoArguments function, double beginPointValue, double endPointValue, double y0, int pointsNumber)
        {            
            double y = 0;
            double y1 = y0;
            double f1 = 0;
            double x = 0;
            double h = (endPointValue - beginPointValue) / pointsNumber;
            _result = new double[2, pointsNumber + 1];            
            for (int i = 0; i <= pointsNumber; i++)
            {
                f1 = function(x, y);
                y = y1 +(h/2)*(function(x,y)+function(x + h ,y + h * f1));
                _result[0, i] = x;
                _result[1, i] = y1; 
                y1 = y;
                x = x + h;
            }
        }

        /// <summary>
        /// Возвращает решение
        /// </summary>        
        public double[,] GetSolution()
        {
            return _result;
        }   
    }
}
